再進入這主題之前,讓我先來談談,究竟何謂是「序列化」與「反序列化」。
這裡 Wiki 告訴了我們:
恩!不意外!字很多
這裡簡單說說
圖片來源:騰訊雲
序列化是將物件狀態轉換為可保存
或可傳輸格式
的形式。而反序列化則是序列化的相反,它可以將資料流轉換成物件。將這兩種處理序搭配使用,使資料容易被用於儲存和傳輸。
二進位序列化
可以保留型別的精確度,這在對應用程式進行不同叫用時保留物件的狀態很有用。例如,藉由將物件序列化至剪貼簿,不同應用程式就可共用它。遠端處理會使用序列化來將物件以「傳值」(By Value) 方式從一電腦或應用程式定義域傳遞至另一電腦或應用程式定義域。
XML 序列化
僅會序列化公用屬性和欄位,而不保留型別精確度。當您要提供或取用資料,而不限制使用該資料的應用程式時,這很有用。因為 XML 是開放式標準,所以在網路上共用資料時,這是一個頗具吸引力的選擇。
不安全的反序列化漏洞主要是鎖定 Java、PHP 或 Node.js 等常見的平臺。它容易導致以下攻擊發生:
這裡舉個 RCE 的例子:
反序列化漏洞利用 Java 反射機制的副作用,在物件 return 之前就將所有動作執行完畢,導致反序列化在解開 byteStream 時並且跳出在跳出 Error 之前,就將 Payload 全數執行完畢。導致攻擊者只要掌握後端程式中有何種函式庫,將函式庫中各種函式做組合,跨函式庫呼叫函式組合成 Gadget Chain,最終執行Runtime.getRuntime().exec()以執行任意惡意代碼。
簡單來說就是一個使用者將 110V 的電器插入 220V 的插座中,雖然是一樣的插座孔,不過使用者並不知道插座的伏特數是多少,直到插座與電器通電、電器燒壞後才發現伏特數不合拍。同樣的,反序列化也是在含有遠端代碼執行的 byteStream 進入系統,在 Payload 執行後才發現,這 byteStream 格式是有問題的。
針對任何序列化的物件落實完整性的檢查。如:數位簽章,防止惡意物件的建立或資料被篡改。